#include "stm32f10x.h"
#include <stdio.h>
#include "aip1628.h"
#include "protocol.h"

/*0 1 2 3 4 5 6 7 8 9 up down of arrow line*/
uint8_t const CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x6,0x6d,0x40,0x00};
uint8_t const addr[]={0xc0,0xc2,0xc4,0xc6,0xc8,0xc5};

void delay_us(int us)
{
	int j;
	for(j=0;j<10;j++);
}
void delay_ms(int ms)
{
   int i,j;
	 for (i=0;i<ms;i++) {
	    for(j=0;j<1000;j++);
	 }

}
/*************************************
函数名称：Tm1628_Write_Bit
函数说明：写单个字节
函数参数：命令参数
函数返回：NULL
*************************************/
void Tm1628_Write_Bit(uint8_t data)
{
	uint8_t i;
	Tm1628_CKL_H;
	Tm1628_DIO_H;

	for (i = 0; i < 8; i++) {
		Tm1628_CKL_L;
		delay_us(100);
		if((data & 0x01) == 1) {
			Tm1628_DIO_H;
		} else {
			Tm1628_DIO_L;
		}
		data = data	>> 1;
		Tm1628_CKL_H;
		delay_us(100);
	}	
}

/*************************************
函数名称：Tm1628_Write_Command
函数说明：写命令
函数参数：命令参数
函数返回：NULL
*************************************/
void Tm1628_Write_Command(u8 unm)
{
	Tm1628_STB_L;
  delay_ms(1);
	Tm1628_Write_Bit(unm);
	Tm1628_STB_H;
	delay_ms(1);	
}

/*************************************
函数名称：Tm1628init
函数说明：TM1628初始化
函数参数：NULL
函数返回：NULL
*************************************/
void Tm1628init(void)
{
	GPIO_InitTypeDef   GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能PB端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;  //LB13-->PB15 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;	//IO口速度为10MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化GPIOB6 - 8
//	Tm1628_Write_Command(0x03);  //7位10段
	Tm1628_ClearDisplay();	//清屏
	Tm1628_GrayScale(2);	//亮度2
	//Tm1628_Fixed(0xc2,0xff);
}

/*************************************
函数名称：Tm1628_Fixed
函数说明：固定写显示
函数参数：(1)data 地址
(2)add	数据
函数返回：NULL
*************************************/
void Tm1628_Fixed(uint8_t addr, uint8_t data)
{
//	Tm1628_Write_Command(0x44);
	Tm1628_STB_L;
	delay_ms(1);
	Tm1628_Write_Bit(addr);
	Tm1628_Write_Bit(data);
	Tm1628_STB_H;
	delay_ms(1);
}

void show_num(uint32_t num)
{
  uint8_t temp[4];
	
	Tm1628_ClearDisplay();
	
	Tm1628_Write_Command(0x03);
	Tm1628_Write_Command(0x44);
	temp[0] = num%10;
	temp[1] = num/10%10;
	temp[2] = num/100%10;
	temp[3] = num/1000%10;

	if(num>=1000) {
		Tm1628_Fixed(addr[0],CODE[temp[0]]);
		Tm1628_Fixed(addr[1],CODE[temp[1]]);
		Tm1628_Fixed(addr[2],CODE[temp[2]]);
		Tm1628_Fixed(addr[3],CODE[temp[3]]);
	}
	else	if(num>=100) {
		Tm1628_Fixed(addr[0],CODE[temp[0]]);
		Tm1628_Fixed(addr[1],CODE[temp[1]]);
		Tm1628_Fixed(addr[2],CODE[temp[2]]);
	}	else	if(num>=10) {
		Tm1628_Fixed(addr[0],CODE[temp[0]]);
		Tm1628_Fixed(addr[1],CODE[temp[1]]);
	} else {
		Tm1628_Fixed(addr[0],CODE[temp[0]] | 0x80);
	}
	
	Tm1628_Fixed(addr[4],CODE[g_arrow_direction]);
	Tm1628_GrayScale(8);
}

void show_arrow(void)
{
	Tm1628_Fixed(addr[4],CODE[g_arrow_direction]);
}

void Tm1628_Clear_Arrow_Display(void)
{
	uint8_t i;

	Tm1628_Write_Command(0x44);
	Tm1628_STB_L;
	delay_ms(1);
	Tm1628_Write_Bit(addr[4]);
	Tm1628_Write_Bit(TM1628_SHOW_CLEAR);
	//g_arrow_direction = TM1628_SHOW_CLEAR;
	Tm1628_STB_H;
	delay_ms(1);
}

void show_line_noorder(void)
{
	Tm1628_Fixed(addr[0],CODE[12]);
	Tm1628_Fixed(addr[1],CODE[12]);
	Tm1628_Fixed(addr[2],CODE[12]);
	Tm1628_Fixed(addr[3],CODE[12]);
	show_arrow();
}
/*************************************
函数名称：Tm1628_Continuous
函数说明：连续写显示
函数参数：(1)data 地址  从C0开始
(2)num	数据
(3)add  数量	最大14
函数返回：NULL
*************************************/
void Tm1628_Continuous(uint8_t data, uint8_t num, uint8_t *add)
{
	uint8_t i;
	Tm1628_Write_Command(0x40);
	Tm1628_STB_L;
	delay_ms(1);
	Tm1628_Write_Bit(data);
	for (i = 0; i < num; i++) {
		Tm1628_Write_Bit(add[i]);
	}
	Tm1628_STB_H;
	delay_ms(1);
}

/*************************************
函数名称：Tm1628_ClearDisplay
函数说明：清屏
函数参数：NULL
函数返回：NULL
*************************************/
void Tm1628_ClearDisplay(void)
{
	uint8_t i;
	Tm1628_Write_Command(0x44);
	Tm1628_STB_L;
	delay_ms(1);
	Tm1628_Fixed(addr[0],TM1628_SHOW_CLEAR);
	Tm1628_Fixed(addr[1],TM1628_SHOW_CLEAR);
	Tm1628_Fixed(addr[2],TM1628_SHOW_CLEAR);
	Tm1628_Fixed(addr[3],TM1628_SHOW_CLEAR);
	Tm1628_STB_H;
	delay_ms(1);
	
	Tm1628_Clear_Arrow_Display();
}

/*************************************
函数名称：Tm1628_GrayScale
函数说明：用于亮度调节 0 - 9
函数参数：亮度 0 - 9
函数返回：NULL
*************************************/
void Tm1628_GrayScale(uint8_t data)
{
	switch(data)
	{
		case(0): Tm1628_Write_Command(GrayScale_ON); break;
		case(1): Tm1628_Write_Command(GrayScale1); break;
		case(2): Tm1628_Write_Command(GrayScale2); break;
		case(3): Tm1628_Write_Command(GrayScale3);	break;	
		case(4): Tm1628_Write_Command(GrayScale4);	break;
		case(5): Tm1628_Write_Command(GrayScale5);	break;
		case(6): Tm1628_Write_Command(GrayScale6);	break;
		case(7): Tm1628_Write_Command(GrayScale7);	break;
		case(8): Tm1628_Write_Command(GrayScale8);	break;
	  case(9): Tm1628_Write_Command(GrayScale_OFF);	break;
	}
}
